import re
from typing import Iterable

import scrapy
from requests import Request

from ..items import VideoItem

"""
下载中间键是如果请求需要额外的处理时 例如：进行网站反爬的绕过、请求代理IP的更换等
1、先在Spiders中对每一页进行请求，如果在得到的数据中获取我们想要的数据的话就要绕过js加载等一些反爬手段
2、对请求进行处理绕过反爬  将请求放在Selenium中进行模拟人工操作绕过js加载等反爬手段 
   这里就在middleware中将请求进行处理
3、然后将处理好的响应数据再放到spiders中对需要的数据进行爬取 将需要的数据保存到items中
4、编写items
5、编写管道将数据进行保存  这里管道继承了FilesPipeline   
    重写get_media_requests方法构建scrapy.Request对象  对象请求的是文件的下载地址  对下载地址进行请求后就会下载文件并且保存到指定文件中
    重写file_path方法 对下载的文件进行自定义命名
6、启用管道并且在setting中设置文件保存的地址
"""

class PixabayVideosSpider(scrapy.Spider):
    name = "pixabay_videos"
    allowed_domains = ["pixabay.com"]

    # start_urls = ["https://pixabay.com"]

    def start_requests(self) -> Iterable[Request]:
        for i in range(1, 3):
            yield scrapy.Request(
                url=f'https://pixabay.com/videos/search/?order=ec&pagi={i}',
                meta={'SeleniumMiddleware': True}  # 标记这里要用到SeleniumMiddleware中间键
            )  # meta源信息  额外的信息根随着request进行传递 也就是做记号

    def parse(self, response):
        """
        对内容进行解析
        :param response:
        :return:
        """
        # print(response.text)
        mp4_urls = re.findall(r'"contentUrl":"(.*?)",', response.text)
        print(len(mp4_urls))
        for mp4_url in mp4_urls[:10]:
            item = VideoItem()
            item['url'] = mp4_url.replace('tiny','large')
            item['name'] = mp4_url.split('/')[-1]
            print(item.items())
            return item     #只会返回一个数据并且终止，测试的时候用return或者说本身解析数据就只有一个
            # yield item